// 引入依賴
import graceChecker from '../common/graceChecker.js'

/**
 * 获取uuid
 */
const getUUID = function() {
	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
		return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)
	})
}

// 封装实时表单验证 -- 实时验证
const onInput = function(e, checkType, checkRule, errorMsg) {
	if (e.detail.value == '') {
		return
	} else {
		// 防抖操作
		const vm = this;
		//频繁点击的时候销毁上一个定时器
		setTimeout(vm.tiems);
		//当没有频繁点击后，最后执行的定时器
		vm.tiems = setTimeout(() => {
			//里面写执行代码
			var oninputFormData = {
				data: e.detail.value
			}
			//定义表单验证规则
			var rule = [{
				name: 'data',
				checkType: checkType,
				checkRule: checkRule,
				errorMsg: errorMsg
			}]
			// 进行表单验证
			var checkRes = graceChecker.check(oninputFormData, rule)
			if (!checkRes) {
				uni.showToast({
					title: graceChecker.error,
					icon: "none"
				})
				return
			}
		}, 1000)
	}
}

// 封装失去焦点表单验证  --- 失去焦点 
const blurInput = function(e, checkType, checkRule, errorMsg) {
	var oninputFormData = {
		data: e.detail.value
	}
	//定义表单验证规则
	var rule = [{
		name: 'data',
		checkType: checkType,
		checkRule: checkRule,
		errorMsg: errorMsg
	}]
	// 进行表单验证
	var checkRes = graceChecker.check(oninputFormData, rule)
	if (!checkRes) {
		uni.showToast({
			title: graceChecker.error,
			icon: "none"
		})
		return
	}
}

// 身份证号验证
const idCard = function(e, cyzjdm) {
	var rule = []
	var oninputFormData = {
		zjhm: e.detail.value
	}
	if (cyzjdm == '11') {
		let data = [{
			name: 'zjhm',
			checkType: 'isCardID',
			checkRule: '',
			errorMsg: '请输入证件号码'
		}]
		rule = rule.concat(data)
	} else {
		let data = [{
			name: 'zjhm',
			checkType: 'notnull',
			checkRule: '',
			errorMsg: '请输入证件号码'
		}]
		rule = rule.concat(data)
	}
	// 进行表单验证
	var checkRes = graceChecker.check(oninputFormData, rule)
	if (!checkRes) {
		uni.showToast({
			title: graceChecker.error,
			icon: "none"
		})
		return
	}
}

// 防疫合格证号、统一社会信用代码
const GszzbhAndFyhgz = function(e, errorMsg) {
	var oninputFormData = {
		data: e.detail.value
	}
	//定义表单验证规则
	var rule = [{
		name: 'data',
		checkType: 'qyba',
		checkRule: '',
		errorMsg: errorMsg
	}]
	// 进行表单验证
	var checkRes = graceChecker.check(oninputFormData, rule)
	if (!checkRes) {
		uni.showToast({
			title: graceChecker.error,
			icon: "none"
		})
		return
	}
}


/**
 * 精确判断数据是否是 Date 类型
 * @param {Any} val 要判断的数据
 * @returns {Boolean} true：是；false：不是；
 */
const isDate = function(val) {
	return Object.prototype.toString.call(val) === '[object Date]';
}


/**
 * 判断数据是否是 String 类型
 * @param {Any} val 要判断的数据
 * @returns {Boolean} true：是；false：不是；
 */
const isString = function(val) {
	return Object.prototype.toString.call(val) === '[object String]';
}


/**
 * 格式化日期
 * @param {Date|String} date 日期或日期字符串
 */
const formatDate = function(date) {
	let YYYY = null;
	let M = null;
	let MM = null;
	let D = null;
	let DD = null;
	let h = null;
	let hh = null;
	let m = null;
	let mm = null;
	let s = null;
	let ss = null;
	let ms = null;
	let ms2 = null;
	let ms3 = null;
	let ms4 = null;

	if (this.isString(date)) {
		// 真机运行时，如果直接用 new Date('YYYY-MM-DD hh:mm:ss') 会报 Invalid Date 错误，所以采用下面的方式创建日期
		let dtAyy = date.replace(/-/g, ':').replace(' ', ':').split(':');
		date = new Date();
		dtArr[0] != undefined ? date.setFullYear(dtArr[0]) : {}; // 年
		dtArr[1] != undefined ? date.setMonth(dtArr[1] - 1) : {}; // 月
		dtArr[2] != undefined ? date.setDate(dtArr[2]) : {}; // 日
		dtArr[3] != undefined ? date.setHours(dtArr[3]) : {}; // 时
		dtArr[4] != undefined ? date.setMinutes(dtArr[4]) : {}; // 分
		dtArr[5] != undefined ? date.setSeconds(dtArr[5]) : {}; // 秒
		dtArr[6] != undefined ? date.setMilliseconds(dtArr[6]) : {}; // 毫秒
	}

	if (this.isDate(date)) {
		YYYY = date.getFullYear();
		M = date.getMonth() + 1;
		MM = M >= 10 ? M : '0' + M;
		D = date.getDate();
		DD = D >= 10 ? D : '0' + D;
		h = date.getHours();
		hh = h >= 10 ? h : '0' + h;
		m = date.getMinutes();
		mm = m >= 10 ? m : '0' + m;
		s = date.getSeconds();
		ss = s >= 10 ? s : '0' + s;
		ms = date.getMilliseconds();
		ms2 = ms;
		ms3 = ms;
		ms4 = ms;
		if (ms < 10) {
			ms2 = '0' + ms;
			ms3 = '00' + ms;
			ms4 = '000' + ms;
		} else if (ms < 100) {
			ms3 = '0' + ms;
			ms4 = '00' + ms;
		} else {
			ms4 = '0' + ms;
		}
	}

	// 返回的数据对象
	let result = {
		YYYY: YYYY,
		MM: MM,
		M: M,
		DD: DD,
		D: D,
		hh: hh,
		h: h,
		mm: mm,
		m: m,
		ss: ss,
		s: s,
		ms: ms,
		ms2: ms2,
		ms3: ms3,
		ms4: ms4,
		fmt1: YYYY + '-' + MM + '-' + DD,
		fmt2: YYYY + '年' + MM + '月' + DD + '日',
		fmt3: YYYY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm,
		notes: 'YYYY（年），MM（月，补0），M（月，不补0），DD（日，补0），D（日，不补0），hh（时，补0），h（时，不补0），mm（分，补0），m（分，不补0），ss（秒，补0），s（秒，不补0），ms（毫秒，不补0），ms2（毫秒，补0到2位），ms3（毫秒，补0到3位），ms4（毫秒，补0到4位），其余的fmt1，fmt2，... 看格式就知道了！'
	};
	return result;
}

// 处理金额函数 
const priceSwitch = function(x) {
	//强制保留两位小数
	var f = parseFloat(x);
	if (isNaN(f)) return false;
	var f = Math.round(x * 100) / 100;
	var s = f.toString();
	var rs = s.indexOf('.');
	if (rs < 0) {
		rs = s.length;
		s += '.';
	}
	while (s.length < (rs + 1) + 2) {
		s += '0';
	}
	//每三位用一个逗号隔开
	var leftNum = s.split(".")[0];
	var rightNum = "." + s.split(".")[1];
	var result;
	//定义数组记录截取后的价格
	var resultArray = new Array();
	if (leftNum.length > 3) {
		var i = true;
		while (i) {
			resultArray.push(leftNum.slice(-3));
			leftNum = leftNum.slice(0, leftNum.length - 3);
			if (leftNum.length < 4) {
				i = false;
			}
		}
		//由于从后向前截取，所以从最后一个开始遍历并存到一个新的数组，顺序调换
		var sortArray = new Array();
		for (var i = resultArray.length - 1; i >= 0; i--) {
			sortArray.push(resultArray[i]);
		}
		result = leftNum + "," + sortArray.join(",") + rightNum;
	} else {
		result = s;
	}
	return result;
}

/**
 * 根据 type 获取时间 
 * @param {Any} type 要判断的数据
 * @returns {string} -2：前天；-1：昨天 ；0：今天；1：明天；2：后天 ; 3: 大后天；
 */
const GetDateStr = function(AddDayCount) {
	var dd = new Date();
	dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期
	var y = dd.getFullYear();
	var m = dd.getMonth() + 1; //获取当前月份的日期
	var d = dd.getDate();
	var hours = dd.getHours(); //小时 ,返回 Date 对象的小时 (0 ~ 23)
	var minutes = dd.getMinutes(); //分钟 ,返回 Date 对象的分钟 (0 ~ 59)
	var seconds = dd.getSeconds(); //秒 ,返回 Date 对象的秒数 (0 ~ 59)   
	//修改月份格式
	if (m >= 1 && m <= 9) {
		m = "0" + m;
	}
	//修改日期格式
	if (d >= 0 && d <= 9) {
		d = "0" + d;
	}
	//修改小时格式
	if (hours >= 0 && hours <= 9) {
		hours = "0" + hours;
	}
	//修改分钟格式
	if (minutes >= 0 && minutes <= 9) {
		minutes = "0" + minutes;
	}
	//修改秒格式
	if (seconds >= 0 && seconds <= 9) {
		seconds = "0" + seconds;
	}
	return y + "-" + m + "-" + d + " " + hours + ":" + minutes + ":" + seconds;;
}

/**
 * 去除0 参数 日期 如 2020-07-08 返回为 2020-7-8
 */
const dislodgeZero = function(str) {
	let strArray = str.split("-");
	strArray = strArray.map(function(val) {
		if (val[0] == "0") {
			return (val = val.slice(1));
		} else {
			return val;
		}
	});
	return strArray.join("-");
}
/**
 * 时间戳转换 yyyy-mm-dd
 */
const formatDateTime = function(inputTime) {
	// var date = new Date(inputTime *1000); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
	var date = new Date(inputTime); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
	var y = date.getFullYear();
	var m = date.getMonth() + 1;
	m = m < 10 ? ('0' + m) : m;
	var d = date.getDate();
	d = d < 10 ? ('0' + d) : d;
	var h = date.getHours();
	h = h < 10 ? ('0' + h) : h;
	var minute = date.getMinutes();
	var second = date.getSeconds();
	minute = minute < 10 ? ('0' + minute) : minute;
	second = second < 10 ? ('0' + second) : second;
	// return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
	return y + '-' + m + '-' + d;
};

// 时间戳转换  YYYY-MM-DD HH-MM-SS
const shijianc = function(time) {
	let date = new Date(time)
	let Y = date.getFullYear() + '-'
	let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
	let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '
	let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
	let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
	let s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())
	return Y + M + D + h + m + s
}

/**
 * 是否有权限
 * @param {*} key
 */
const isAuth = function(key) {
	// 利用正则匹配是否包含
	let getBtnPermissionArr = window.localStorage.getItem('permissions');
	// console.log(getBtnPermissionArr)
	var reg = RegExp(key);
	// console.log(reg)
	// console.log(reg.test(getBtnPermissionArr))
	return reg.test(getBtnPermissionArr)
}

/**
 * 
 * @param dateNow :Date类
 * @param intervalDays ：间隔天数
 * @param bolPastTime  ：Boolean,判断在参数date之前，还是之后，
 */
const getDateRange = function(dateNow, intervalDays, bolPastTime) {
	let oneDayTime = 24 * 60 * 60 * 1000;
	let list = [];
	let lastDay;

	if (bolPastTime == true) {
		lastDay = new Date(dateNow.getTime() - intervalDays * oneDayTime);
		list.push(formateDate(lastDay));
		list.push(formateDate(dateNow));
	} else {
		lastDay = new Date(dateNow.getTime() + intervalDays * oneDayTime);
		list.push(formateDate(dateNow));
		list.push(formateDate(lastDay));
	}
	return list;
}
const formateDate = function(time) {
	let year = time.getFullYear()
	let month = time.getMonth() + 1
	let day = time.getDate()

	if (month < 10) {
		month = '0' + month
	}

	if (day < 10) {
		day = '0' + day
	}

	return year + '-' + month + '-' + day

}

/**
 * 格式化数据添加单位
 */
const changeMoney = function(num, moneyUnits) {
	// console.log(num, moneyUnits)
	// console.log(JSON.stringify(num).slice(0, 3))
	if (JSON.stringify(num).length > 5) {
		return {
			num: JSON.stringify(num).slice(0, 2),
			unit: moneyUnits[1]
		}
	} else {
		return {
			num: num,
			unit: moneyUnits[0]
		}
	}
}
/**
 * 返回上一个页面
 */
const onClickLeft = function() {
	uni.navigateBack()
}


/**
 * 提示showTost
 */
const Toast = function(title) {
	uni.showToast({
		icon: "none",
		title: title
	})
}


/**
 * 跳转页面简写
 */
const navTo = function(url) {
	uni.navigateTo({
		url: url
	})
}

/**
 * 获取字典信息
 * DictName  Name:字典名称  Type: String
 */
const Dict = function(DictName) {
	var data = JSON.parse(uni.getStorageSync('Dict'))[DictName]
	var dictArr = []
	data.map(res => {
		dictArr.push({
			"text": res.dictLabel,
			"value": res.dictValue
		})
	})
	return dictArr
}
/**
 * 比较两个时间谁大谁小
 * time1 格式  2022-9-9 14:27:20  time2 格式 2022-9-9 14:27:32
 * time1 > time2  false
 * time1 < time2  true
 */
const compareTheSize = function(time1, time2) {
	if (time1 !== '' && time2 !== '') {
		if (new Date(time1).getTime() > new Date(time2).getTime()) {
			console.log('开始时间 > 结束时间')
			return false
		} else {
			console.log('开始时间 < 结束时间')
			return true
		}
	}
}


/**
 *
 * @param {Array} arrs 树形数据
 * @param {string} childs 树形数据子数据的属性名,常用'children'
 * @param {Array} attrArr 需要提取的公共属性数组(默认是除了childs的全部属性)
 * @returns
 */
const extractTree = function(arrs, childs, attrArr) {
	let attrList = [];
	if (!Array.isArray(arrs) && !arrs.length) return [];
	if (typeof childs !== 'string') return [];
	if (!Array.isArray(attrArr) || Array.isArray(attrArr) && !attrArr.length) {
		attrList = Object.keys(arrs[0]);
		attrList.splice(attrList.indexOf(childs), 1);
	} else {
		attrList = attrArr;
	}
	let list = [];
	const getObj = (arr) => {
		arr.forEach(function(row) {
			let obj = {};
			attrList.forEach(item => {
				obj[item] = row[item];
			});
			list.push(obj);
			if (row[childs]) {
				getObj(row[childs]);
			}
		})
		return list;
	}
	return getObj(arrs);
}

// 将扁平化数据结构转换为树形结构
const tranListTotreeList = function(list) {
	// 映射一个map对象,遍历list ,给map赋值 键为id 值为对应对象
	const map = {}
	list.forEach(item => {
		item.children = []
		map[item.id] = item
	})
	// console.log('list', list)
	// console.log('map', map)
	// 遍历对象 判断是否有父节点
	const treeList = []
	list.forEach(item => {
		if (item.pId) {
			// 有父节点,不是根节点
			// 找到父节点, 把子节点赋值给父节点的children属性
			const parent = map[item.pId]
			parent.children.push(item)
		} else {
			// 是根节点
			treeList.push(item)
		}
	})
	return treeList
}

// 通过js获取url参数
const GetQueryString = function() {
	const url = window.location.href;
	const index = url.indexOf('?');

	if (index === -1) {
		return {};
	}

	const queryString = url.substring(index + 1);
	const regex = /([^&=]+)=([^&]*)/g;
	const params = {};
	let match;

	while (match = regex.exec(queryString)) {
		params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
	}

	return params;
};


// 翻译设备状态
const deviceState = function(e) {
	var option = [{
		"label": "未知",
		"value": -1,
	}, {
		"label": "离线",
		"value": 0,
	}, {
		"label": "在线",
		"value": 1,
	}, {
		"label": "故障",
		"value": 2,
	}, {
		"label": "停用",
		"value": 3,
	}, {
		"label": "暂停",
		"value": 4,
	}, {
		"label": "试用",
		"value": 5,
	}, {
		"label": "报警",
		"value": 6,
	}]
	var label = ''
	option.map(res => {
		if (res.value === e) {
			label = res.label
		}
	})
	return label
}

// 翻译设备网络类型  "type": 2, //网关类型 1 以太网   2 4G    3 WIFI
const deviceType = function(e) {
	var option = [{
		"label": "以太网",
		"value": 1,
	}, {
		"label": "4G",
		"value": 2,
	}, {
		"label": "WIFI",
		"value": 3,
	}]
	var label = ''
	option.map(res => {
		if (res.value === e) {
			label = res.label
		}
	})
	return label
}


// 单位翻译
const unitFannYi = function(item, num) {
	if (item === "wendu") {
		return "℃"
	} else if (item === null || item === 'null') {
		return ''
	} else if (item === 'open_close') { // 关闭打开
		if (num === '0') {
			return '关闭'
		}
		if (num === '1') {
			return '打开'
		}
	} else if (item === 'SHIFOU') { // 关闭打开
		if (num === '0') {
			return '否'
		}
		if (num === '1') {
			return '是'
		}
	} else {
		return item
	}
}


// 根据当前时间获取上个月的月初跟月末时间
const getShangYueChuAndSangYueMo = function() {
	// 获取当前日期
	var currentDate = new Date();

	// 上个月的年份和月份
	var lastMonthYear = currentDate.getFullYear();
	var lastMonthMonth = currentDate.getMonth() - 1;

	// 处理跨年的情况
	if (lastMonthMonth < 0) {
		lastMonthYear -= 1;
		lastMonthMonth = 11; // 12 个月中的最后一个月是 11
	}

	// 获取上个月的月初时间
	var firstDayOfLastMonth = new Date(lastMonthYear, lastMonthMonth, 1);
	var formattedFirstDay =
		`${firstDayOfLastMonth.getFullYear()}-${String(firstDayOfLastMonth.getMonth() + 1).padStart(2, '0')}-01`;

	// 获取上个月的月末时间
	var lastDayOfLastMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0);
	var formattedLastDay =
		`${lastDayOfLastMonth.getFullYear()}-${String(lastDayOfLastMonth.getMonth() + 1).padStart(2, '0')}-${lastDayOfLastMonth.getDate()}`;

	// console.log("上个月的月初时间：", formattedFirstDay);
	// console.log("上个月的月末时间：", formattedLastDay);

	var data = {
		"yueChu": formattedFirstDay,
		"yueMo": formattedLastDay
	}
	return data

}



// 获取本月月初 到 当前时间
const getBenYueChuAndDangRi = function() {
	// 获取当前日期
	var currentDate = new Date();

	// 本月的年份和月份
	var thisMonthYear = currentDate.getFullYear();
	var thisMonthMonth = currentDate.getMonth();

	// 获取本月的月初时间
	var firstDayOfThisMonth = new Date(thisMonthYear, thisMonthMonth, 1);
	var formattedFirstDay = `${thisMonthYear}-${String(thisMonthMonth + 1).padStart(2, '0')}-01`;

	// 当天日期
	var formattedCurrentDate = `${currentDate.toISOString().slice(0, 10)}`;

	// console.log("本月的月初时间：", formattedFirstDay);
	// console.log("当天日期：", formattedCurrentDate);

	var data = {
		"yueChu": formattedFirstDay,
		"dangRi": formattedCurrentDate
	}
	return data
}



// 判断是否开启震动
const isShock = function() {
	// 获取个人信息
	var userDataInfo = uni.getStorageSync("userData")

	if (userDataInfo.isShock) { // true 开启  false 关闭
		// 开启震动
		uni.vibrateLong();
	}
}



// 判断是否开启按键音
const isSpeech = function() {

	const innerAudioContext = uni.createInnerAudioContext()
	innerAudioContext.autoplay = false // 是否自动开始播放，默认为 false
	innerAudioContext.loop = false // 是否循环播放，默认为 false
	uni.setInnerAudioOption({ // ios在静音状态下能够正常播放音效
		obeyMuteSwitch: false, // 是否遵循系统静音开关，默认为 true。当此参数为 false 时，即使用户打开了静音开关，也能继续发出声音。
		success: function(e) {},
		fail: function(e) {}
	})
	innerAudioContext.src = "https://www.aizyiot.cn/home/file/base/20.mp3"
	// 获取个人信息
	var userDataInfo = uni.getStorageSync("userData")

	if (userDataInfo.isSpeech) { // true 开启  false 关闭
		// 开启按键音
		innerAudioContext.play()
	}
}




// 解决深拷贝问题
const deepClone = function(obj) {
	if (obj === null || typeof obj !== 'object') {
		return obj;
	}
	const newObj = Array.isArray(obj) ? [] : {};
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			newObj[key] = deepClone(obj[key]);
		}
	}
	return newObj;
}

module.exports = {
	getUUID: getUUID,
	onInput: onInput,
	blurInput: blurInput,
	idCard: idCard,
	isDate: isDate,
	isString: isString,
	formatDate: formatDate,
	priceSwitch: priceSwitch,
	GetDateStr: GetDateStr,
	dislodgeZero: dislodgeZero,
	formatDateTime: formatDateTime,
	isAuth: isAuth,
	getDateRange: getDateRange,
	formateDate: formateDate,
	changeMoney: changeMoney,
	onClickLeft: onClickLeft,
	Toast: Toast,
	navTo: navTo,
	Dict: Dict,
	compareTheSize: compareTheSize,
	extractTree: extractTree,
	tranListTotreeList: tranListTotreeList,
	shijianc: shijianc,
	deviceState: deviceState,
	deviceType: deviceType,
	GetQueryString: GetQueryString,
	unitFannYi: unitFannYi,
	getShangYueChuAndSangYueMo: getShangYueChuAndSangYueMo,
	getBenYueChuAndDangRi: getBenYueChuAndDangRi,
	isShock: isShock,
	isSpeech: isSpeech,
	deepClone: deepClone,
}